2.4.4 声音系统
1. 概述
一个好的游戏,往往都有着丰富的声音系统,比如说在Minecraft这个游戏中,当你靠近一个洞穴的时候系统就会播放风声,当你的附近有着僵尸的时候就会传来僵尸的吼叫声,玩家可以通过声音来判断目前的状态,这无疑增加了游戏的趣味性和冒险性。
本部分内容将带领读者完成在Minecraft中导入声音、并在适当的时候播放声音的内容。我们假设读者已经拥有了想要应用在Minecraft中的OGG格式的音乐,也就是后缀名为ogg的音乐文件。这里我们采用的是本部分的作者使用计算机合成的一段非常短的,被用作音效的音乐。如有需要,可以通过这个链接获取音乐,并随意使用,作者不保留这段音乐的任何版权。
2. 音乐索引文件
我们需要在assets.fmltutor
包下创建一个文件:sounds.json
:
src/main/resources/assets/fmltutor/sounds.json:
{
"fmltutor.test": {
"category": "player",
"sounds": [
"fmltutor"
]
}
}
这个名为sounds.json
的文件,就是这个Mod的音乐索引文件,其中贮存了各种各样音乐的索引。
这个文件的内容,是一段非常普通的JSON文件,这个文件通过储存JSON对象的方式提供键值对。这里的键值对中,标识符为这个声音的名称,在这里就是fmltutor.test
,在程序中调用的时候要加上Mod id,也就是fmltutor:fmltutor.test
,而值就是关于这个声音的信息。
category
表示的是这个声音的类型,总共有ambient
(环境)、weather
(天气)、player
(玩家)、neutral
(中立)、hostile
(敌对)、block
(方块)、record
(唱片)、music
(音乐)、master
(控制)这八种类型。sounds
表示的就是声音了,这里表示的声音存放在这个音乐索引文件所在目录下的sounds
文件夹下,在这里就是assets.fmltutor.sounds
包下,这里表示的声音是一个列表,在游戏中会随机选取其中一个所代表的声音播放。
sounds
表示的声音列表还可以有volume
、pitch
等选项,分别表示响度、音量等。不过这里我们不作讨论,感兴趣的读者可以自己查找相关信息。
然后我们在assets.fmltutor.sounds
下放置一个名为fmltutor.ogg
的OGG格式的音乐,就可以了。
3. 播放这个音乐
net.minecraft.world.World
类有数个用于播放音乐的方法,其中有两个方法比较常用,其中一个为playSoundAtEntity
,用于在特定实体所在位置播放音乐,还有一个就是playSound
方法,用于在特定位置播放特定的声音,还可以设定这个声音是否有声速延迟。
我们先来看一下playSound
方法:
- 前三个参数表示这个声音所在位置的坐标,分别为
x
、y
、z
。 - 第四个参数表示这个声音的名称,在上面的声音索引文件中有所提及。
- 第五个参数表示这个声音的响度,默认响度为1.0F。
- 第六个参数表示这个声音的音调,默认音调为1.0F。
- 最后一个参数表示这个声音是否有延迟,比如雷声就存在着延迟。
我们再来看一下playSoundAtEntity
方法:
- 第一个参数表示该实体,没有什么过多的解释。
- 第二个参数表示声音的名称,和上面一样。
- 最后两个参数分别表示声音的响度和音调,和上面的同样没有差别。
有了这些,我们就可以试一试了:
src/main/java/com/github/ustc_zzzz/fmltutor/common/EventLoader.java(部分):
@SubscribeEvent
public void onPlayerItemCrafted(PlayerEvent.ItemCraftedEvent event)
{
event.player.worldObj.playSoundAtEntity(event.player, "fmltutor:fmltutor.test", 1.0F, 1.0F);
if (event.crafting.getItem() == Item.getItemFromBlock(BlockLoader.grassBlock))
{
event.player.triggerAchievement(AchievementLoader.buildGrassBlock);
}
}
当玩家在工作台合成物品之后便会在玩家所在处播放一个叫作fmltutor
的Mod下的一个名为fmltutor.test
的声音,也就是这里的示例声音。
打开游戏试试吧~